Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Message-Digest Algorithm 5</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Message-Digest_Algorithm_5"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Message-Digest_Algorithm_5 rootpage-Message-Digest_Algorithm_5 skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Message-Digest Algorithm 5</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>Message-Digest Algorithm 5</b> (<b>MD5</b>) ist eine verbreitete <a href="Kryptographische_Hashfunktion" title="Kryptographische Hashfunktion">kryptographische Hashfunktion</a>, die aus einer beliebigen Nachricht einen 128-Bit-Hashwert berechnet. Sie wurde 1991 von <a href="Ronald_L._Rivest" title="Ronald L. Rivest">Ronald L. Rivest</a> am <a href="Massachusetts_Institute_of_Technology" title="Massachusetts Institute of Technology">Massachusetts Institute of Technology</a> als Nachfolger von <a href="Message-Digest_Algorithm_4" title="Message-Digest Algorithm 4">MD4</a> entwickelt. Der englische Begriff „Message Digest“ steht für einen kurzen Zahlenwert fester Länge, der <a href="Determinismus_(Algorithmus)" title="Determinismus (Algorithmus)">deterministisch</a> aus der gegebenen Nachricht berechnet wird.
</p><p>Inzwischen ist bekannt, dass MD5 keine <a href="Kollisionsresistenz" title="Kollisionsresistenz">Kollisionsresistenz</a> bietet und somit unsicher ist. Auch die <a href="Preimage-Angriff" title="Preimage-Angriff">Preimage-Resistenz</a> ist theoretisch gebrochen, allerdings ist ein Preimage-Angriff gegen MD5 nicht praktikabel.
</p>

<div class="mw-heading mw-heading2"><h2 id="MD5-Hashwert">MD5-Hashwert</h2></div>
<p>Die 128&nbsp;Bit langen MD5-Hashwerte werden üblicherweise als 32-stellige <a href="Hexadezimal" class="mw-redirect" title="Hexadezimal">Hexadezimalzahl</a> notiert. Beispiel für eine 59 Byte lange <a href="American_Standard_Code_for_Information_Interchange" title="American Standard Code for Information Interchange">ASCII</a>-Eingabe mit zugehörigem MD5-Hashwert:
</p>
<pre>md5("Franz jagt im komplett verwahrlosten Taxi quer durch Bayern") =
a3cca2b2aa1e3b5b3b5aad99a8529074
</pre>
<p>Es ist praktisch unmöglich, eine weitere Nachricht, die genau diesen Hashwert ergibt, zu bestimmen. Eine beliebige Änderung des Textes (im Folgenden wird nur ein Buchstabe verändert) erzeugt aufgrund des <a href="Lawineneffekt_(Kryptographie)" title="Lawineneffekt (Kryptographie)">Lawineneffekts</a> einen komplett anderen Hashwert:
</p>
<pre>md5("Fran<b>k</b> jagt im komplett verwahrlosten Taxi quer durch Bayern") =
7e716d0e702df0505fc72e2b89467910
</pre>
<p>Der Hash einer Zeichenfolge der Länge null ist:
</p>
<pre>md5("") =
d41d8cd98f00b204e9800998ecf8427e
</pre>
<div class="mw-heading mw-heading2"><h2 id="Verwendung_und_Verfügbarkeit"><span id="Verwendung_und_Verf.C3.BCgbarkeit"></span>Verwendung und Verfügbarkeit</h2></div>
<p>Unter den meisten <a href="Linux" title="Linux">Linux</a>-Distributionen wird das Programm md5sum als Bestandteil der <a href="GNU_Core_Utilities" title="GNU Core Utilities">coreutils</a> standardmäßig installiert.
</p><p>Auf <a href="Berkeley_Software_Distribution" title="Berkeley Software Distribution">BSD</a>-abgeleiteten Betriebssystemen wie <a href="MacOS" title="MacOS">macOS</a> gibt es das Kommando md5. In <a href="Python_(Programmiersprache)" title="Python (Programmiersprache)">Python</a> ist MD5 in der <a href="Programmbibliothek" title="Programmbibliothek">Programmbibliothek (hashlib)</a> enthalten.
</p><p>Auf vielen anderen <a href="Unix" title="Unix">Unix</a>-Derivaten ist Python installiert oder man kann sich mit dem meist installierten Programm <a href="OpenSSL" title="OpenSSL">OpenSSL</a> behelfen. Python kann auch online aufgerufen werden. <a href="Microsoft_Windows" title="Microsoft Windows">Microsoft-Windows</a>-Betriebssysteme ab den Versionen <a href="Microsoft_Windows_8#Windows_8.1" title="Microsoft Windows 8">Windows 8.1</a> bzw. <a href="Microsoft_Windows_Server_2012#Windows_Server_2012_R2" title="Microsoft Windows Server 2012">Windows Server 2012 R2</a> verfügen standardmäßig über das <a href="PowerShell" title="PowerShell">PowerShell</a> Cmdlet Get-Filehash.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Prüfsumme_einer_Datei"><span id="Pr.C3.BCfsumme_einer_Datei"></span>Prüfsumme einer Datei</h3></div>
<p>Nach erfolgreichem Download einer oder mehrerer Dateien kann der Anbieter der Daten in einer weiteren Datei den dazugehörigen MD5-Hashwert zur Verfügung stellen. Über ein Prüfprogramm kann der Hashwert aus der heruntergeladenen Datei berechnet werden, der dann mit dem zur Verfügung gestellten Hashwert verglichen wird. Sind beide Hashwerte identisch, ist die <a href="Integrit%C3%A4t_(Informationssicherheit)" title="Integrität (Informationssicherheit)">Integrität</a> der heruntergeladenen Datei bestätigt. Demnach traten beim Download der Datei keine Übertragungsfehler auf, was dem Anwendungszweck einer <a href="Pr%C3%BCfsumme" title="Prüfsumme">Prüfsumme</a> entspricht. Dies bietet keine Sicherheit hinsichtlich einer gezielten Datenmanipulation durch einen Angreifer (<a href="Man-in-the-Middle-Angriff" title="Man-in-the-Middle-Angriff">Man-in-the-Middle-Angriff</a>), da der Angreifer neben den übertragenen Daten auch den angebotenen MD5-Hashwert manipulieren kann. Bei Verwendung eines <a href="Spiegelserver" title="Spiegelserver">Spiegelservers</a> für den Download stellt beispielsweise der Betreiber des Spiegelservers einen möglichen Angreifer dar. Um eine Manipulation durch diesen auszuschließen, muss entweder der MD5-Hashwert aus einer vertrauenswürdigen Quelle über einen sicheren Kanal bezogen werden, oder die <a href="Authentizit%C3%A4t" title="Authentizität">Authentizität</a> der Datei muss durch ein anderes Verfahren sichergestellt werden. Dazu eignet sich eine <a href="Digitale_Signatur" title="Digitale Signatur">digitale Signatur</a> oder ein <a href="Message_Authentication_Code" title="Message Authentication Code">Message Authentication Code</a>, der eine Hashfunktion mit einem schlüsselbasierten, kryptographischen Mechanismus kombiniert.
</p>
<div class="mw-heading mw-heading3"><h3 id="Zufallsgenerator">Zufallsgenerator</h3></div>
<p>Wie jede kryptographische Hashfunktion kann MD5 als deterministischer Generator von <a href="Kryptographisch_sicherer_Zufallszahlengenerator" title="Kryptographisch sicherer Zufallszahlengenerator">Pseudo-Zufallszahlen</a> genutzt werden. Dadurch lässt sich zum Beispiel eine <a href="Stromverschl%C3%BCsselung" title="Stromverschlüsselung">Stromverschlüsselung</a> realisieren.
</p>
<div class="mw-heading mw-heading3"><h3 id="Datenbanken">Datenbanken</h3></div>
<p>MD5 kann als Hashfunktion für <a href="Datenbankindex" title="Datenbankindex">Datenbankindizes</a> verwendet werden. In gängigen SQL-Datenbankmanagementsysteme wie <a href="MySQL" title="MySQL">MySQL</a> oder <a href="PostgreSQL" title="PostgreSQL">PostgreSQL</a> ist MD5 als <a href="Funktion_(Programmierung)" title="Funktion (Programmierung)">Funktion</a> eingebaut. In dem folgenden Beispiel wird zu jeder gespeicherten <a href="Uniform_Resource_Locator" title="Uniform Resource Locator">URL</a> zusätzlich deren MD5-Hashwert gespeichert. Über den Hashwert lässt sich eine Abfrage realisieren, die effizienter als eine textbasierte Suche ist.
</p>
<div class="mw-highlight mw-highlight-lang-sql mw-content-ltr" dir="ltr"><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="o">`</span><span class="n">urls</span><span class="o">`</span><span class="w"> </span><span class="p">(</span>
<span class="w"> </span><span class="o">`</span><span class="n">url</span><span class="o">`</span><span class="w"> </span><span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span>
<span class="w"> </span><span class="o">`</span><span class="n">url_md5</span><span class="o">`</span><span class="w"> </span><span class="nb">CHAR</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span><span class="w"> </span><span class="k">GENERATED</span><span class="w"> </span><span class="n">ALWAYS</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span><span class="n">MD5</span><span class="p">(</span><span class="o">`</span><span class="n">url</span><span class="o">`</span><span class="p">))</span><span class="w"> </span><span class="n">STORED</span><span class="p">,</span>
<span class="w"> </span><span class="k">UNIQUE</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="o">`</span><span class="n">index_url</span><span class="o">`</span><span class="w"> </span><span class="p">(</span><span class="o">`</span><span class="n">url_md5</span><span class="o">`</span><span class="p">)</span>
<span class="p">);</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Algorithmus">Algorithmus</h2></div>

<p>MD5 basiert auf der <a href="Merkles_Meta-Verfahren" class="mw-redirect" title="Merkles Meta-Verfahren">Merkle-Damgård-Konstruktion</a>, um aus einer Nachricht variabler Länge eine Ausgabe fester Länge von 128&nbsp;Bit zu erzeugen. Zuerst wird eine Eins an die Ausgangsnachricht angehängt. Danach wird die Ausgangsnachricht mit Nullen so aufgefüllt, dass ihre Länge 64 Bits davon entfernt ist, durch 512 teilbar zu sein. Nun wird eine 64-Bit-Zahl, die die Länge der Ausgangsnachricht in Bits kodiert, angehängt. Die Nachrichtenlänge ist jetzt durch 512 teilbar.
</p><p>Der Hauptbestandteil von MD5 ist eine Einweg-Kompressionsfunktion, die nacheinander die 512-Bit-Eingabeblöcke verarbeitet. Die Kompressionsfunktion arbeitet mit einem 128-Bit-Puffer, der in vier 32-Bit-Wörter <i>A</i>, <i>B</i>, <i>C</i> und <i>D</i> unterteilt ist. Diese werden beim ersten Nachrichtenblock mit festgelegten Konstanten <a href="Initialisierungsvektor" title="Initialisierungsvektor">initialisiert</a>. Die Behandlung eines Nachrichtenblocks geschieht in vier einander ähnlichen Stufen, die „Runden“ genannt werden. Jede Runde besteht aus 16 Operationen, basierend auf einer nichtlinearen Funktion <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle F}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>F</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle F}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/545fd099af8541605f7ee55f08225526be88ce57.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.741ex; height:2.176ex;" alt="{\displaystyle F}" loading="lazy"></span>, modularer Addition und <a href="Bitweiser_Operator#Zyklische_Verschiebung_ohne_Übertragsbit" title="Bitweiser Operator">Linksrotation</a>. Es gibt vier mögliche Varianten der Funktion <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle F}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>F</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle F}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/545fd099af8541605f7ee55f08225526be88ce57.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.741ex; height:2.176ex;" alt="{\displaystyle F}" loading="lazy"></span>, in jeder Runde wird davon eine andere verwendet (hier genannt <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle F}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>F</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle F}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/545fd099af8541605f7ee55f08225526be88ce57.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.741ex; height:2.176ex;" alt="{\displaystyle F}" loading="lazy"></span>, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/f5f3c8921a3b352de45446a6789b104458c9f90b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.827ex; height:2.176ex;" alt="{\displaystyle G}" loading="lazy"></span>, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>H</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/75a9edddcca2f782014371f75dca39d7e13a9c1b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.064ex; height:2.176ex;" alt="{\displaystyle H}" loading="lazy"></span> und <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle I}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>I</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle I}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/535ea7fc4134a31cbe2251d9d3511374bc41be9f.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.172ex; height:2.176ex;" alt="{\displaystyle I}" loading="lazy"></span>):
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle F(X,Y,Z)=(X\wedge {Y})\vee (\neg {X}\wedge {Z})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>F</mi>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>,</mo>
<mi>Y</mi>
<mo>,</mo>
<mi>Z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>∧<!-- ∧ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>Y</mi>
</mrow>
<mo stretchy="false">)</mo>
<mo>∨<!-- ∨ --></mo>
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>X</mi>
</mrow>
<mo>∧<!-- ∧ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>Z</mi>
</mrow>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle F(X,Y,Z)=(X\wedge {Y})\vee (\neg {X}\wedge {Z})}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/29bfebad4e7bdd4a2fc1210694eb5664262faecc.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:34.481ex; height:2.843ex;" alt="{\displaystyle F(X,Y,Z)=(X\wedge {Y})\vee (\neg {X}\wedge {Z})}" loading="lazy"></span></dd>
<dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G(X,Y,Z)=(X\wedge {Z})\vee (Y\wedge \neg {Z})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>,</mo>
<mi>Y</mi>
<mo>,</mo>
<mi>Z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>∧<!-- ∧ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>Z</mi>
</mrow>
<mo stretchy="false">)</mo>
<mo>∨<!-- ∨ --></mo>
<mo stretchy="false">(</mo>
<mi>Y</mi>
<mo>∧<!-- ∧ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>Z</mi>
</mrow>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G(X,Y,Z)=(X\wedge {Z})\vee (Y\wedge \neg {Z})}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/7068038702afd55190f991518f3a9188565f32d0.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:34.267ex; height:2.843ex;" alt="{\displaystyle G(X,Y,Z)=(X\wedge {Z})\vee (Y\wedge \neg {Z})}" loading="lazy"></span></dd>
<dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H(X,Y,Z)=X\oplus Y\oplus Z}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>H</mi>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>,</mo>
<mi>Y</mi>
<mo>,</mo>
<mi>Z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>X</mi>
<mo>⊕<!-- ⊕ --></mo>
<mi>Y</mi>
<mo>⊕<!-- ⊕ --></mo>
<mi>Z</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H(X,Y,Z)=X\oplus Y\oplus Z}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/c121ed0510b6ad3ffde9b89cec96ff7552ae9236.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:25.587ex; height:2.843ex;" alt="{\displaystyle H(X,Y,Z)=X\oplus Y\oplus Z}" loading="lazy"></span></dd>
<dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle I(X,Y,Z)=Y\oplus (X\vee \neg {Z})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>I</mi>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>,</mo>
<mi>Y</mi>
<mo>,</mo>
<mi>Z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>Y</mi>
<mo>⊕<!-- ⊕ --></mo>
<mo stretchy="false">(</mo>
<mi>X</mi>
<mo>∨<!-- ∨ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>Z</mi>
</mrow>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle I(X,Y,Z)=Y\oplus (X\vee \neg {Z})}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/2f119366de7d323f5e02b8d12a741968fa9d0f99.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:27.797ex; height:2.843ex;" alt="{\displaystyle I(X,Y,Z)=Y\oplus (X\vee \neg {Z})}" loading="lazy"></span></dd></dl>
<p><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \oplus ,\wedge ,\vee ,\neg }">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo>⊕<!-- ⊕ --></mo>
<mo>,</mo>
<mo>∧<!-- ∧ --></mo>
<mo>,</mo>
<mo>∨<!-- ∨ --></mo>
<mo>,</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \oplus ,\wedge ,\vee ,\neg }</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/ed39414f7a4720bbf82749a9fcd3ebb15220ea72.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:9.561ex; height:2.343ex;" alt="{\displaystyle \oplus ,\wedge ,\vee ,\neg }" loading="lazy"></span> stehen jeweils für <a href="Bitweiser_Operator" title="Bitweiser Operator">bitweise</a> XOR, AND, OR und NOT-Operationen.
</p><p>Das Ergebnis aus dem 128-Bit-Puffer wird zur Verarbeitung des nächsten Nachrichtenblocks weiterverwendet. Die Kompressionsfunktion wird nacheinander angewandt bis alle 512-Bit-Nachrichtenblöcke verarbeitet wurden. Die Ausgabe des Algorithmus ist ein 128 Bit langer MD5-Hashwert.
</p>
<div class="mw-heading mw-heading2"><h2 id="Referenzimplementierung">Referenzimplementierung</h2></div>
<p>RFC&nbsp;1321<sup id="cite_ref-RFC1321_2-0" class="reference"><a href="#cite_note-RFC1321-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> enthält auch unter dem Titel <i>Appendix A Reference Implementation</i> eine Implementierung des Algorithmus in C. Diese Implementierung aus dem Jahre 1992 von <i>RSA Data Security, Inc.</i> läuft auf vielen 64-Bit-Systemen fehlerhaft, sie berechnet falsche Hashwerte. Dies liegt an diesen Zeilen in der Datei <i>global.h</i>:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cm">/* UINT4 defines a four byte word */</span>
<span class="k">typedef</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">UINT4</span><span class="p">;</span>
</pre></div>
<p>Der Typ <i>unsigned long int</i> ist nicht notwendigerweise 4&nbsp;Byte lang. Der Fehler kann behoben werden, indem man diese Zeilen ersetzt durch:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;inttypes.h&gt;</span>
<span class="p">...</span>
<span class="cm">/* UINT4 defines a four byte word */</span>
<span class="k">typedef</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">UINT4</span><span class="p">;</span>
</pre></div>
<p>Eine andere, lauffähige Implementierung von <a href="L_Peter_Deutsch" title="L Peter Deutsch">L Peter Deutsch</a> findet man auf Sourceforge.net. Diese Implementation ist aus der Spezifikation des RFC&nbsp;1321<sup id="cite_ref-RFC1321_2-1" class="reference"><a href="#cite_note-RFC1321-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> abgeleitet und nicht aus der vorher erwähnten <a href="Referenzimplementierung" title="Referenzimplementierung">Referenzimplementierung</a> in RFC&nbsp;1321. Darum sind bei Verwendung dieser Implementierung keinerlei Verweise auf <i>RSA Data Security, Inc.</i> notwendig.
</p>
<div class="mw-heading mw-heading2"><h2 id="Pseudocode">Pseudocode</h2></div>
<p>Es folgt der <a href="Pseudocode" title="Pseudocode">Pseudocode</a> für den MD5-<a href="Algorithmus" title="Algorithmus">Algorithmus</a>.
</p>
<pre><span style="color:green;">// <i>Beachte: Alle Variablen sind vorzeichenlose (unsigned) 32-Bit-Werte und</i>
// <i>verhalten sich bei Berechnungen <a href="Kongruenz_(Zahlentheorie)" title="Kongruenz (Zahlentheorie)">kongruent (≡)</a> modulo 2^32</i></span>
</pre>
<pre><span style="color:green;"> <i>// Definition der linksrotation Funktion, c ist der übergebene Wert von s[i] - siehe Hauptschleife</i></span>
<b>linksrotation</b>(x, c)
<b>return</b> (x &lt;&lt; c)binär <b>or</b> (x &gt;&gt; (32-c));
</pre>
<pre><span style="color:green;">// <i>s definiert die Anzahl der Bits, die pro Runde rotiert werden:</i></span>
<b>var</b> <i>uint</i>[64] s, K
s[ 0..15]&nbsp;:= { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}
s[16..31]&nbsp;:= { 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}
s[32..47]&nbsp;:= { 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}
s[48..63]&nbsp;:= { 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}
</pre>
<pre><span style="color:green;">// <i>Verwende den binären Vorkommateil vom 2^32-fachen Betrag des Sinus</i>
// <i>von Integerwerten als Konstanten:</i></span>
<b>für alle</b> i <b>von</b> 0 <b>bis</b> 63
(
K[i]&nbsp;:= floor(abs(sin(i + 1)) × 2^32)
)
</pre>
<pre>// Alternativ kann man auch folgende Tabelle nutzen:
K[ 0.. 3]&nbsp;:= { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee }
K[ 4.. 7]&nbsp;:= { 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501 }
K[ 8..11]&nbsp;:= { 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be }
K[12..15]&nbsp;:= { 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821 }
K[16..19]&nbsp;:= { 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa }
K[20..23]&nbsp;:= { 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8 }
K[24..27]&nbsp;:= { 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed }
K[28..31]&nbsp;:= { 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a }
K[32..35]&nbsp;:= { 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c }
K[36..39]&nbsp;:= { 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70 }
K[40..43]&nbsp;:= { 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05 }
K[44..47]&nbsp;:= { 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665 }
K[48..51]&nbsp;:= { 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039 }
K[52..55]&nbsp;:= { 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1 }
K[56..59]&nbsp;:= { 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1 }
K[60..63]&nbsp;:= { 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 }
</pre>
<pre><span style="color:green;">// <i>Initialisiere die Variablen: (laut RFC&nbsp;1321)</i></span>
<b>var</b> <i>uint</i> a0&nbsp;:= 0x67452301
<b>var</b> <i>uint</i> b0&nbsp;:= 0xEFCDAB89
<b>var</b> <i>uint</i> c0&nbsp;:= 0x98BADCFE
<b>var</b> <i>uint</i> d0&nbsp;:= 0x10325476
</pre>
<pre><span style="color:green;">// <i>Vorbereitung der Nachricht 'message':</i></span>
<b>var</b> <i>uint</i> message_laenge&nbsp;:= bit_length(message)
<b>erweitere</b> message <b>um</b> bit "1"
<b>erweitere</b> message <b>um</b> bits "0" <b>bis</b> Länge von message in bits <a href="Kongruenz_(Zahlentheorie)" title="Kongruenz (Zahlentheorie)">≡</a> 448 (mod 512)
<b>erweitere</b> message <b>um</b> message_laenge als <i>64-Bit <a href="Little_endian" class="mw-redirect" title="Little endian">little-endian</a> Integer</i>
</pre>
<pre><span style="color:green;">// <i>Verarbeite die Nachricht in aufeinander folgenden 512-Bit-Blöcken:</i></span>
<b>für alle</b> <i>512-Bit</i> Block <b>von</b> message
(
unterteile Block in 16 32-bit <a href="Little_endian" class="mw-redirect" title="Little endian">little-endian</a> Worte M[i], 0 ≤ i ≤ 15
</pre>
<pre> <span style="color:green;">// <i>Initialisiere den Hash-Wert für diesen Block:</i></span>
<b>var</b> <i>uint</i> A&nbsp;:= a0
<b>var</b> <i>uint</i> B&nbsp;:= b0
<b>var</b> <i>uint</i> C&nbsp;:= c0
<b>var</b> <i>uint</i> D&nbsp;:= d0
</pre>
<pre> <span style="color:green;">// <i>Hauptschleife:</i></span>
<span style="color:green;">// <b>not</b> Operator entspricht dem <a href="Einerkomplement" title="Einerkomplement">Einerkomplement</a></span>
<b>für alle</b> i <b>von</b> 0 <b>bis</b> 63
(
<b>wenn</b> 0 ≤ i ≤ 15 <b>dann</b>
F&nbsp;:= (B <b>and</b> C) <b>or</b> ((<b>not</b> B) <b>and</b> D)
g&nbsp;:= i
<b>sonst wenn</b> 16 ≤ i ≤ 31 <b>dann</b>
F&nbsp;:= (B <b>and</b> D) <b>or</b> (C <b>and</b> (<b>not</b> D))
g&nbsp;:= (5×i + 1) <b>mod</b> 16
<b>sonst wenn</b> 32 ≤ i ≤ 47 <b>dann</b>
F&nbsp;:= B <b>xor</b> C <b>xor</b> D
g&nbsp;:= (3×i + 5) <b>mod</b> 16
<b>sonst wenn</b> 48 ≤ i ≤ 63 <b>dann</b>
F&nbsp;:= C <b>xor</b> (B <b>or</b> (<b>not</b> D))
g&nbsp;:= (7×i) <b>mod</b> 16
<b>wenn_ende</b>
</pre>
<pre> temp&nbsp;:= D
D&nbsp;:= C
C&nbsp;:= B
B&nbsp;:= B + <b>linksrotation</b>((A + F + K[i] + M[g]), s[i])
A&nbsp;:= temp
)
</pre>
<pre> <span style="color:green;">// <i>Addiere den Hash-Wert des Blocks zur Summe der vorherigen Hashes:</i></span>
a0&nbsp;:= a0 + A
b0&nbsp;:= b0 + B
c0&nbsp;:= c0 + C
d0&nbsp;:= d0 + D
)
</pre>
<pre><b>var</b> <i>uint</i> digest&nbsp;:= a0 <b>anfügen</b> b0 <b>anfügen</b> c0 <b>anfügen</b> d0 <span style="color:green;">// <i>Darstellung als <a href="Little_endian" class="mw-redirect" title="Little endian">little-endian</a></i></span>
</pre>
<p>Anstatt der Originalformulierung aus dem RFC&nbsp;1321 kann zur Effizienzsteigerung Folgendes verwendet werden:
</p>
<pre>( 0 ≤ i ≤ 15): F&nbsp;:= D <b>xor</b> (B <b>and</b> (C <b>xor</b> D))
(16 ≤ i ≤ 31): F&nbsp;:= C <b>xor</b> (D <b>and</b> (B <b>xor</b> C))
</pre>
<div class="mw-heading mw-heading2"><h2 id="Sicherheit">Sicherheit</h2></div>
<p>MD5 wurde mit dem Ziel entwickelt, eine höhere Sicherheit als sein Vorgänger <a href="Message-Digest_Algorithm_4" title="Message-Digest Algorithm 4">MD4</a> zu bieten, da <a href="Kryptoanalyse" title="Kryptoanalyse">Kryptoanalysen</a> dieser Zeit ergaben, dass MD4 wahrscheinlich nicht <a href="Kollisionsresistenz" title="Kollisionsresistenz">kollisionsresistent</a> ist. MD5 erlangte weite Verbreitung und wurde ursprünglich als kryptographisch sicher angesehen. Heute ist bekannt, dass MD5 keine <a href="Kollisionsresistenz" title="Kollisionsresistenz">Kollisionsresistenz</a> bietet. Mit geringem Aufwand lassen sich zwei unterschiedliche Nachrichten <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/f82cade9898ced02fdd08712e5f0c0151758a0dd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.442ex; height:2.176ex;" alt="{\displaystyle M}" loading="lazy"></span> und <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M'}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msup>
<mi>M</mi>
<mo>′</mo>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M'}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/5a3b2ef3304c46b5e7859eec0b1bc057c8eb3f75.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:3.183ex; height:2.509ex;" alt="{\displaystyle M'}" loading="lazy"></span> erzeugen, die denselben Hashwert <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \operatorname {MD5} (M)=\operatorname {MD5} (M')}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>MD5</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>M</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>MD5</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<msup>
<mi>M</mi>
<mo>′</mo>
</msup>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \operatorname {MD5} (M)=\operatorname {MD5} (M')}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/99669d4ffdd41da3a7d7aee3513692dbd36d7962.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:22.481ex; height:3.009ex;" alt="{\displaystyle \operatorname {MD5} (M)=\operatorname {MD5} (M')}" loading="lazy"></span> erzeugen. Nicht alle kryptographischen Anwendungen erfordern Kollisionsresistenz. Beispielsweise setzt die <a href="Schnorr-Signatur" title="Schnorr-Signatur">Schnorr-Signatur</a>, anders als die Signatur auf Basis von <a href="RSA-Kryptosystem" title="RSA-Kryptosystem">RSA</a> oder <a href="Digital_Signature_Algorithm" title="Digital Signature Algorithm">Digital Signature Algorithm</a>, keine kollisionsresistente Hashfunktion voraus.
</p><p>In Internetstandards und technischen Richtlinien, beispielsweise von der <a href="Internet_Engineering_Task_Force" title="Internet Engineering Task Force">IETF</a><sup id="cite_ref-RFC6151_3-0" class="reference"><a href="#cite_note-RFC6151-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> oder dem <a href="Bundesamt_f%C3%BCr_Sicherheit_in_der_Informationstechnik" title="Bundesamt für Sicherheit in der Informationstechnik">BSI</a>,<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> wird heute von der Verwendung von MD5 abgeraten.
</p>
<div class="mw-heading mw-heading3"><h3 id="Preimage-Angriffe">Preimage-Angriffe</h3></div>
<p>Seit 2009 ist ein theoretischer <a href="Preimage-Angriff" title="Preimage-Angriff">Preimage-Angriff</a> auf MD5 bekannt, der jedoch mit <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 2^{123,4}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msup>
<mn>2</mn>
<mrow class="MJX-TeXAtom-ORD">
<mn>123</mn>
<mo>,</mo>
<mn>4</mn>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 2^{123,4}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/07e0af4d2a1b7b9a41cf698ef3400140f8998ac9.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:5.14ex; height:2.676ex;" alt="{\displaystyle 2^{123,4}}" loading="lazy"></span> MD5-Hashoperationen einen Rechenaufwand jenseits der Praktikabilität erfordert.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> Bei einem Preimage-Angriff sucht man zu einem vorgegebenen Hashwert <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \operatorname {MD5} (M)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>MD5</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>M</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \operatorname {MD5} (M)}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/125ae340750daba547237125db3b84021e4fa520.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:9.321ex; height:2.843ex;" alt="{\displaystyle \operatorname {MD5} (M)}" loading="lazy"></span> die Nachricht <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/f82cade9898ced02fdd08712e5f0c0151758a0dd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.442ex; height:2.176ex;" alt="{\displaystyle M}" loading="lazy"></span> oder eine andere Nachricht <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M'}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msup>
<mi>M</mi>
<mo>′</mo>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M'}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/5a3b2ef3304c46b5e7859eec0b1bc057c8eb3f75.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:3.183ex; height:2.509ex;" alt="{\displaystyle M'}" loading="lazy"></span>, so dass man <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \operatorname {MD5} (M)=\operatorname {MD5} (M')}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>MD5</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>M</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>MD5</mi>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<msup>
<mi>M</mi>
<mo>′</mo>
</msup>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \operatorname {MD5} (M)=\operatorname {MD5} (M')}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/99669d4ffdd41da3a7d7aee3513692dbd36d7962.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:22.481ex; height:3.009ex;" alt="{\displaystyle \operatorname {MD5} (M)=\operatorname {MD5} (M')}" loading="lazy"></span> erhält. Da man beim Preimage-Angriff <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/f82cade9898ced02fdd08712e5f0c0151758a0dd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.442ex; height:2.176ex;" alt="{\displaystyle M}" loading="lazy"></span> nicht frei wählen kann, ist dieser Angriff viel schwieriger.
</p><p>Ein Preimage-Angriff wäre beispielsweise erforderlich, um nachträglich ein gefälschtes Dokument zu erstellen, das zu einer bestehenden, mit <a href="RSA-Kryptosystem" title="RSA-Kryptosystem">RSA</a> und MD5 erzeugten <a href="Digitale_Signatur" title="Digitale Signatur">Signatur</a> passt. Es ist jedoch durch einen Kollisionsangriff möglich, zwei Dokumente zu erstellen, die denselben MD5-Hashwert ergeben, dann das erste, legitime Dokument signieren zu lassen, und anschließend dieses durch das zweite, gefälschte Dokument auszutauschen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Kollisionsangriffe">Kollisionsangriffe</h3></div>
<p>Bereits 1994 veröffentlichten Bert de Boer und Antoon Bosselaers einen Algorithmus zum Erzeugen von Pseudokollisionen auf die Kompressionsfunktion von MD5: zwei unterschiedliche Initialisierungskonstanten ergeben für dieselbe Nachricht denselben Hashwert.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p><p>1996 fand <a href="Hans_Dobbertin_(Kryptologe)" title="Hans Dobbertin (Kryptologe)">Hans Dobbertin</a> eine Kollision für zwei unterschiedliche Nachrichten. Es handelt sich dabei um eine echte Kollision, also zwei speziell präparierte Nachrichten, die sich unterscheiden, aber dennoch denselben Hashwert ergeben. Allerdings verwendete Dobbertin eine modifizierte MD5-Variante, in der andere Initialisierungskonstanten (für A, B, C, D) verwendet werden. Auch war es nicht möglich, den Inhalt der kollidierenden Nachrichten beliebig vorzugeben. Somit waren praktische Angriffe auf MD5 zwar nicht möglich, aber die ersten Schwächen des Algorithmus wurden deutlich.
</p><p>Im August 2004 gelang es einer chinesischen Forschergruppe um Xiaoyun Wang Kollisionen in MD5 systematisch zu erzeugen.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> Der Anfang der Nachrichten kann beliebig gewählt werden, ist aber bei beiden Nachrichten identisch (<i>Common-Prefix-Kollision</i>): <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M_{0},M_{1},...,M_{i-1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>.</mo>
<mo>.</mo>
<mo>.</mo>
<mo>,</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M_{0},M_{1},...,M_{i-1}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/8ec8e0ccb6db4c719d4687e6041c95166ad8736a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:17.975ex; height:2.509ex;" alt="{\displaystyle M_{0},M_{1},...,M_{i-1}}" loading="lazy"></span>. Dahinter folgen zwei präparierte Paare von Nachrichtenblöcken <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M_{i},M_{i+1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M_{i},M_{i+1}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/ff8e7888b8d1f92e23bafbedde464d4b61e1ee79.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:9.242ex; height:2.509ex;" alt="{\displaystyle M_{i},M_{i+1}}" loading="lazy"></span> und <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M'_{i},M'_{i+1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msubsup>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
<mo>′</mo>
</msubsup>
<mo>,</mo>
<msubsup>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
<mo>′</mo>
</msubsup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M'_{i},M'_{i+1}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/b2b7b841f6b2a2fb163facce4c4ee34a6cb58e22.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.171ex; width:9.372ex; height:3.009ex;" alt="{\displaystyle M'_{i},M'_{i+1}}" loading="lazy"></span>, die sich unterscheiden, aber dennoch denselben Hashwert ergeben. Aufgrund der Merkle-Damgård-Konstruktion kann optional an beide Nachrichten ein identischer Suffix angehängt werden, wobei beide Nachrichten weiterhin einen identischen Hashwert ergeben: <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M_{i+2},...,M_{i+n}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>+</mo>
<mn>2</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>.</mo>
<mo>.</mo>
<mo>.</mo>
<mo>,</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>+</mo>
<mi>n</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M_{i+2},...,M_{i+n}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/6c1454890dc1e10d8bd1408db72219f4654a2ed6.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:15.642ex; height:2.509ex;" alt="{\displaystyle M_{i+2},...,M_{i+n}}" loading="lazy"></span>.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> Der Rechenaufwand zur Erzeugung des ersten Angriffsblocks dauerte auf einem <a href="IBM_Power" class="mw-redirect" title="IBM Power">IBM p690</a> Hochleistungsrechner etwa eine Stunde, die des zweiten Angriffsblocks bis zu fünf Minuten. Der Angriff setzt voraus, dass zwei 512-Bit-Nachrichtenblöcke (insgesamt 128 Bytes) in die Nachricht eingefügt werden, die abhängig vom Nachrichtenpräfix präpariert werden. Da die Angriffsblöcke nicht frei gewählt werden können, schränkt dies je nach Anwendungsszenario die Praktikabilität des Angriffs ein.
</p><p>Kurz nach der Veröffentlichung von Wang wurde das <a href="Volunteer-Computing" title="Volunteer-Computing">Volunteer-Computing-Projekt</a> MD5CRK eingestellt, das versuchte, eine Kollision per <a href="Brute-Force-Methode" title="Brute-Force-Methode">Brute-Force-Methode</a> zu finden. Die Angriffsmethode wurde von Wang und anderen Forschergruppen verbessert, sodass ein PC heute innerhalb von Sekunden eine MD5-Kollision berechnen kann.
</p><p>Der Aufwand zum Finden einer Kollision ist größer, wenn der Anfang der beiden Nachrichten abweicht (<i>Chosen-Prefix-Kollision</i>). 2008 gelang es einer Gruppe um Marc Stevens und Alexander Sotirov einen solchen Kollisionsangriff durchzuführen, um ein gefälschtes <a href="Digitales_Zertifikat" title="Digitales Zertifikat">CA-Zertifikat</a> zu erzeugen, das von gängigen Webbrowsern als vertrauenswürdige <a href="Zertifizierungsstelle_(Digitale_Zertifikate)" title="Zertifizierungsstelle (Digitale Zertifikate)">Zertifizierungsstelle</a> anerkannt wurde. Mit diesem waren sie prinzipiell in der Lage, für jede beliebige URL ein <a href="Transport_Layer_Security" title="Transport Layer Security">SSL</a>-Zertifikat zu fälschen und damit die Sicherheitsmechanismen von <a href="Hypertext_Transfer_Protocol_Secure" title="Hypertext Transfer Protocol Secure">HTTPS</a> auszuhebeln. Die Arbeit wurde erstmals auf dem 25. <a href="Chaos_Communication_Congress" title="Chaos Communication Congress">Chaos Communication Congress</a> vorgestellt<sup id="cite_ref-talk25c3sslHarmful_9-0" class="reference"><a href="#cite_note-talk25c3sslHarmful-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> und einige Monate später in einem wissenschaftlichen Artikel veröffentlicht.<sup id="cite_ref-sslHarmful_10-0" class="reference"><a href="#cite_note-sslHarmful-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> Zur Kollisionsberechnung benutzten sie einen Cluster von 200 <a href="PlayStation_3" title="PlayStation 3">Sony PlayStation 3</a>.
</p><p>Die 2012 entdeckte Windows-Malware <a href="Flame_(Computerwurm)" title="Flame (Computerwurm)">Flame</a> verwendete ein gefälschtes Code-Signing-Zertifikat, das auf einer neuen und bis dahin unbekannten Variante einer Chosen-Prefix-Kollision für MD5 basierte.<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Password-Hashing">Password-Hashing</h3></div>
<p>Ein Einsatzzweck von MD5 und anderen kryptographischen Hashfunktionen ist die <a href="Schl%C3%BCsselableitung" title="Schlüsselableitung">Schlüsselableitung</a> aus einem geheimen <a href="Passwort" title="Passwort">Passwort</a>. Wenn die Hashwerte dem Angreifer bekannt sind, können sie per <a href="Brute-Force-Methode" title="Brute-Force-Methode">Brute-Force-Methode</a> oder <a href="W%C3%B6rterbuchangriff" title="Wörterbuchangriff">Wörterbuchangriff</a> zum Klartext zurückgerechnet werden. Der Angriff besteht darin, zu möglichst vielen Passwortkandidaten den dazugehörigen Hashwert zu berechnen und ihn auf Gleichheit mit dem gesuchten Passwort-Hashwert zu vergleichen. Dabei handelt es sich um einen naiven Preimage-Angriff, dessen Erfolg davon abhängt, ob das Passwort erraten werden kann und wie viele Hashwerte der Angreifer in einer gegebenen Zeit berechnen kann.
</p><p>Die Brute-Force-Methode ist bei MD5 durch den Einsatz von <a href="General_Purpose_Computation_on_Graphics_Processing_Unit" title="General Purpose Computation on Graphics Processing Unit">GPGPU</a> besonders effizient, da sich der MD5-Algorithmus auf <a href="Grafikprozessor" title="Grafikprozessor">Grafikprozessoren</a> gut parallelisieren und effizient berechnen lässt. Aus diesem Grund eignen sich spezialisierte Hashfunktionen wie zum Beispiel <a href="Bcrypt" title="Bcrypt">bcrypt</a> oder <a href="PBKDF2" title="PBKDF2">PBKDF2</a> besser zum sicheren Speichern von Passwort-Hashwerten.
</p><p>Eine Maßnahme zur Erhöhung der Effizienz eines Brute-Force-Angriffs ist es, mehrere Passwort-Hashwerte gleichzeitig anzugreifen. Hierbei muss die Hashwert-Berechnung nur einmal erfolgen, kann aber gegen eine Liste von Hashwerten erfolgen. Diese Effizienzsteigerung kann durch die Verwendung eines <a href="Salt_(Kryptologie)" title="Salt (Kryptologie)">Salt</a> abgewehrt werden. Ein Salt ist eine zufällige <a href="Zeichenkette" title="Zeichenkette">Zeichenkette</a>, die bei der Hashwert-Berechnung an das Passwort angefügt wird und die mit dem Passwort-Hashwert unverschlüsselt gespeichert wird. Idealerweise verwendet jedes Passwort ein einmaliges Salt, da der Angreifer dann keinen Mehrfachvergleich gegen eine Liste von Passwort-Hashes durchführen kann, sondern für jede Vergleichsoperation die Hashfunktion mit dem jeweils einmaligen Salt neu berechnen muss.
</p><p>Eine andere Angriffsmethode stellen <a href="Rainbow_Table" title="Rainbow Table">Regenbogentabellen</a> dar. In diesen Tabellen sind Zeichenketten mit den zugehörigen Hashwerten gespeichert. Es handelt sich dabei um einen Kompromiss des Angreifers zwischen dem Rechenaufwand und Speicherbedarf (<a href="Time-Memory_Tradeoff" title="Time-Memory Tradeoff">Time-Memory Tradeoff</a>). Gegenüber einem Brute-Force-Angriff spart die Verwendung von Regenbogentabellen teilweise Rechenaufwand, benötigt jedoch viel Speicherplatz zum Durchsuchen der vorberechneten und gespeicherten Tabellen. Für die Erstellung der Regenbogentabellen ist ein hoher Rechenaufwand erforderlich, jedoch nur einmalig, wenn die Tabellen für mehrere Angriffe wiederverwendet werden. Auch hier kann durch die Verwendung eines Salt die Angriffsmethode abgewehrt werden. Der Angreifer müsste für jeden zufälligen Salt eine eigene Regenbogentabelle vorberechnen, wodurch die <a href="Wiederverwendbarkeit" title="Wiederverwendbarkeit">Wiederverwendbarkeit</a> und damit das Einsparpotential der Regenbogentabelle nicht mehr gegeben ist.
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Hans Dobbertin: <i>Cryptanalysis of MD5 compress</i>. Announcement on Internet, Mai 1996 (englisch) <a rel="nofollow" class="external text" href="http://citeseer.ist.psu.edu/dobbertin96cryptanalysis.html">citeseer.ist.psu.edu</a></li>
<li>Hans Dobbertin: <i>The Status of MD5 After a Recent Attack</i>. In: <i>CryptoBytes</i>, 1996, 2(2) (englisch).</li>
<li>Philip Hawkes, Michael Paddon, Gregory G. Rose: <i>Musings on the Wang et al. MD5 Collision</i>. Detaillierte Analyse der differentiellen Attacke auf den MD5 (englisch)</li>
<li>Vlastimil Klima: <i>Finding MD5 Collisions on a Notebook PC using multi-message modifications</i>. Nochmals verbesserte Angriffstechnik (englisch)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li>R. Rivest: <i><a href="Request_for_Comments" title="Request for Comments">RFC</a>: <style data-mw-deduplicate="TemplateStyles:r250917974">
/* start https://de.wikipedia.org/ */


.mw-parser-output .dewiki-iconexternal>a{background-position:center right!important;background-repeat:no-repeat!important}body.skin-minerva .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/OOjs_UI_icon_external-link-ltr-progressive.svg")!important;background-size:10px!important;padding-right:13px!important}body.skin-timeless .mw-parser-output .dewiki-iconexternal>a,body.skin-monobook .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/MediaWiki_external_link_icon.svg")!important;padding-right:13px!important}body.skin-vector .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/Link.ernal-small-ltr-progressive.svg")!important;background-size:0.857em!important;padding-right:1em!important}


/* end https://de.wikipedia.org/ */
</style><span class="dewiki-iconexternal"><a href="https://datatracker.ietf.org/doc/html/rfc1321" class="extiw external" title="rfc:1321">1321</a></span></i>&nbsp;– <i><span lang="en">The MD5 Message-Digest Algorithm</span></i>. April 1992 (englisch).</li>
<li><a rel="nofollow" class="external text" href="http://www.mathstat.dal.ca/~selinger/md5collision/">MD5 Collision Demo.</a> mathstat.dal.ca/~selinger – Zwei unterschiedliche Programme mit gleichem MD5-Hash und einer Bibliothek zur Generierung weiterer solcher Programme (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://cryptography.hyperlink.cz/MD5_collisions.html">papers und Demos zu MD5-Kollisionen.</a> cryptography.hyperlink.cz (englisch)</li>
<li>Jürgen Schmidt: <a rel="nofollow" class="external text" href="https://www.heise.de/security/artikel/Konsequenzen-der-erfolgreichen-Angriffe-auf-MD5-270106.html"><i>Hash mich, die zweite</i>.</a></li>
<li><a rel="nofollow" class="external text" href="http://de.toolpage.org/tool/md5">Online-Generator zum Erzeugen von MD5-Hashe.</a> de.toolpage.org</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-4.0"><i>Beschreibung des Powershell Cmdlet Get-Filehash</i>.</a></span>
</li>
<li id="cite_note-RFC1321-2"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-RFC1321_2-0">a</a></sup> <sup><a href="#cite_ref-RFC1321_2-1">b</a></sup></span> <span class="reference-text">
R. Rivest: <i><a href="Request_for_Comments" title="Request for Comments">RFC</a>: <span class="dewiki-iconexternal"><a href="https://datatracker.ietf.org/doc/html/rfc1321" class="extiw external" title="rfc:1321">1321</a></span></i>&nbsp;– <i><span lang="en">The MD5 Message-Digest Algorithm</span></i>. April 1992 (englisch).</span>
</li>
<li id="cite_note-RFC6151-3"><span class="mw-cite-backlink"><a href="#cite_ref-RFC6151_3-0">↑</a></span> <span class="reference-text">Sean Turner, Lily Chen: <i><a href="Request_for_Comments" title="Request for Comments">RFC</a>: <span class="dewiki-iconexternal"><a href="https://datatracker.ietf.org/doc/html/rfc6151" class="extiw external" title="rfc:6151">6151</a></span></i>&nbsp;– <i><span lang="en">Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms</span></i>. März 2011 (englisch).</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102.pdf?__blob=publicationFile&amp;v=8"><i>Kryptographische Verfahren: Empfehlungen und Schlüssellängen.</i></a> (PDF) BSI TR-02102-1. Bundesamt für Sicherheit in der Informationstechnik, 9.&nbsp;Januar 2023,<span class="Abrufdatum"> abgerufen am 4.&nbsp;Februar 2023</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AMessage-Digest+Algorithm+5&amp;rft.title=Kryptographische+Verfahren%3A+Empfehlungen+und+Schl%C3%BCssell%C3%A4ngen&amp;rft.description=Kryptographische+Verfahren%3A+Empfehlungen+und+Schl%C3%BCssell%C3%A4ngen&amp;rft.identifier=https%3A%2F%2Fwww.bsi.bund.de%2FSharedDocs%2FDownloads%2FDE%2FBSI%2FPublikationen%2FTechnischeRichtlinien%2FTR02102%2FBSI-TR-02102.pdf%3F__blob%3DpublicationFile%26v%3D8&amp;rft.publisher=Bundesamt+f%C3%BCr+Sicherheit+in+der+Informationstechnik&amp;rft.date=2023-01-09">&nbsp;</span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text">Yu Sasaki, Kazumaro Aoki: <cite style="font-style:italic">Finding Preimages in Full MD5 Faster Than Exhaustive Search</cite>. In: Antoine Joux (Hrsg.): <cite style="font-style:italic">Advances in Cryptology – EUROCRYPT 2009</cite>. <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/978-3-642-01001-9_8">10.1007/978-3-642-01001-9_8</a></span>.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Message-Digest+Algorithm+5&amp;rft.atitle=Finding+Preimages+in+Full+MD5+Faster+Than+Exhaustive+Search&amp;rft.au=Yu+Sasaki%2C+Kazumaro+Aoki&amp;rft.btitle=Advances+in+Cryptology+-+EUROCRYPT+2009&amp;rft.doi=10.1007%2F978-3-642-01001-9_8&amp;rft.genre=book" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text">Bert de Boer, Antoon Bosselaers: <cite style="font-style:italic">Collisions for the compression function of MD5</cite>. In: Tor Helleseth (Hrsg.): <cite style="font-style:italic">Proceedings of EUROCRYPT ’93</cite>. Springer-Verlag, New York 1994, ISBN 3-540-57600-2, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/3-540-48285-7_26">10.1007/3-540-48285-7_26</a></span>.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Message-Digest+Algorithm+5&amp;rft.atitle=Collisions+for+the+compression+function+of+MD5&amp;rft.au=Bert+de+Boer%2C+Antoon+Bosselaers&amp;rft.btitle=Proceedings+of+EUROCRYPT+%E2%80%9993&amp;rft.date=1994&amp;rft.doi=10.1007%2F3-540-48285-7_26&amp;rft.genre=book&amp;rft.isbn=3540576002&amp;rft.place=New+York&amp;rft.pub=Springer-Verlag" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a></span> <span class="reference-text"><span class="cite">Xiaoyun Wang, Dengguo Feng, Xuejia Lai, Hongbo Yu: <a rel="nofollow" class="external text" href="http://eprint.iacr.org/2004/199.pdf"><i>Collisions for Hash Functions MD4, MD5, HAVAL-128 and RIPEMD.</i></a> (PDF; 57&nbsp;kB)<span class="Abrufdatum"> Abgerufen am 4.&nbsp;Februar 2023</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AMessage-Digest+Algorithm+5&amp;rft.title=Collisions+for+Hash+Functions+MD4%2C+MD5%2C+HAVAL-128+and+RIPEMD&amp;rft.description=Collisions+for+Hash+Functions+MD4%2C+MD5%2C+HAVAL-128+and+RIPEMD&amp;rft.identifier=http%3A%2F%2Feprint.iacr.org%2F2004%2F199.pdf&amp;rft.creator=Xiaoyun+Wang%2C+Dengguo+Feng%2C+Xuejia+Lai%2C+Hongbo+Yu">&nbsp;</span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.mscs.dal.ca/~selinger/md5collision/">Erläuterung zum Kollisionsproblem bei Manipulation von md5-Hashwerten</a></span>
</li>
<li id="cite_note-talk25c3sslHarmful-9"><span class="mw-cite-backlink"><a href="#cite_ref-talk25c3sslHarmful_9-0">↑</a></span> <span class="reference-text"><span class="cite">25c3 Talk: David Molnar, Marc Stevens, Arjen Lenstra, Benne de Weger, Alexander Sotirov, Jacob Appelbaum, Dag Arne Osvik: <a rel="nofollow" class="external text" href="https://media.ccc.de/v/25c3-3023-en-making_the_theoretical_possible"><i>MD5 considered harmful today.</i></a> 30.&nbsp;Dezember 2008,<span class="Abrufdatum"> abgerufen am 19.&nbsp;Juli 2025</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AMessage-Digest+Algorithm+5&amp;rft.title=MD5+considered+harmful+today&amp;rft.description=MD5+considered+harmful+today&amp;rft.identifier=https%3A%2F%2Fmedia.ccc.de%2Fv%2F25c3-3023-en-making_the_theoretical_possible&amp;rft.creator=25c3+Talk%3A+David+Molnar%2C+Marc+Stevens%2C+Arjen+Lenstra%2C+Benne+de+Weger%2C+Alexander+Sotirov%2C+Jacob+Appelbaum%2C+Dag+Arne+Osvik&amp;rft.date=2008-12-30">&nbsp;</span></span>
</li>
<li id="cite_note-sslHarmful-10"><span class="mw-cite-backlink"><a href="#cite_ref-sslHarmful_10-0">↑</a></span> <span class="reference-text"><span class="cite">Alexander Sotirov, Marc Stevens, Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik, Benne de Weger: <a rel="nofollow" class="external text" href="http://www.win.tue.nl/hashclash/rogue-ca/"><i>MD5 considered harmful today.</i></a> 30.&nbsp;Dezember 2008,<span class="Abrufdatum"> abgerufen am 30.&nbsp;Dezember 2008</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AMessage-Digest+Algorithm+5&amp;rft.title=MD5+considered+harmful+today&amp;rft.description=MD5+considered+harmful+today&amp;rft.identifier=http%3A%2F%2Fwww.win.tue.nl%2Fhashclash%2Frogue-ca%2F&amp;rft.creator=Alexander+Sotirov%2C+Marc+Stevens%2C+Jacob+Appelbaum%2C+Arjen+Lenstra%2C+David+Molnar%2C+Dag+Arne+Osvik%2C+Benne+de+Weger&amp;rft.date=2008-12-30">&nbsp;</span></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a></span> <span class="reference-text"><span class="cite">Marc Stevens: <a rel="nofollow" class="external text" href="http://www.cwi.nl/news/2012/cwi-cryptanalist-discovers-new-cryptographic-attack-variant-in-flame-spy-malware"><i>Technical Background Of The Flame Collision Attack.</i></a> CWI, 7.&nbsp;Juni 2012,<span class="Abrufdatum"> abgerufen am 8.&nbsp;Juni 2012</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AMessage-Digest+Algorithm+5&amp;rft.title=Technical+Background+Of+The+Flame+Collision+Attack&amp;rft.description=Technical+Background+Of+The+Flame+Collision+Attack&amp;rft.identifier=http%3A%2F%2Fwww.cwi.nl%2Fnews%2F2012%2Fcwi-cryptanalist-discovers-new-cryptographic-attack-variant-in-flame-spy-malware&amp;rft.creator=Marc+Stevens&amp;rft.publisher=CWI&amp;rft.date=2012-06-07&amp;rft.language=en">&nbsp;</span> “<span lang="en">the results have shown that not our published chosen-prefix collision attack was used, but an entirely new and unknown variant</span>”</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-07-19" href="https://de.wikipedia.org/wiki/?title=Message-Digest_Algorithm_5&amp;oldid=258051173">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>